BOJ_2138 전구와 스위치

그리디로 접근하여 푸는 문제
i번째 전구를 누르면 i-1, i, i+1의 숫자가 바뀌게 된다
어떤 순서로 눌러도 결과는 같기 때문에 맨 앞에서부터 차례대로 탐색하면 되며,
전구의 색이 다르면 -> 같게 만들면서 그리디하게 풀어나간다

N=1부터 i-1~N까지 비교하며 만약 i-1의 전구 색이 다르다면 현재 전구를 누른다
왜냐하면 i번 째에 전구를 누르지 않는다면 더 이상 i-1의 전구 색을 바꿀 수 없기 때문!
그렇게 끝까지 비교해 나가며 N번째에는 N-1과 N의 색만 바꿔준다

이 문제의 핵심은 첫 번째 전구에 있다
첫 번째 전구는 비교할 수 있는 이전 전구가 존재하지 않기 때문이다
그렇기 때문에 첫 번째 전구를 눌렀을 때/누르지 않았을 때 2가지로 경우를 나누어 2번 탐색해야 한다

package BJO;  
  
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
import java.util.Arrays;  
import java.util.stream.Stream;  
  
public class BJO_2138_전구와스위치 {  
  
static int N;  
static int[] answer;  
  
static int minCnt = Integer.MAX_VALUE;  
  
public static void main(String[] args) throws IOException {  
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
N = Integer.parseInt(br.readLine());  
  
int[] bulb = Stream.ofparseInt).toArray(;  
answer = Stream.ofparseInt).toArray(;  
  
// 첫 번째 스위치를 누르는 경우와 누르지 않는 경우로 나눈다  
int[] firstClickBulb = Arrays.copyOf(bulb, bulb.length);  
firstClickBulb[0] ^= 1;  
firstClickBulb[1] ^= 1;  
  
clickClick(bulb, 0);  
clickClick(firstClickBulb, 1);  
  
// System.out.println(Arrays.toString(bulb));  
// System.out.println(Arrays.toString(firstClickBulb));  
System.out.println(minCnt == Integer.MAX_VALUE ? -1 : minCnt);  
}  
  
static void clickClick(int[] now, int cnt) {  
for (int i = 1; i < now.length; i++) {  
if (now[i - 1] != answer[i - 1]) {  
cnt++;  
now[i - 1] = now[i - 1] ^ 1;  
now[i] = now[i] ^ 1;  
  
if (i + 1 < now.length) {  
now[i + 1] ^= 1;  
}  
}  
}  
  
if (correctCheck(now)) {  
minCnt = Math.min(cnt, minCnt);  
}  
}  
  
static boolean correctCheck(int[] now) {  
for (int i = 0; i < N; i++) {  
if (now[i] != answer[i]) {  
return false;  
}  
}  
  
return true;  
}  
}

#greedy